<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 单例模式 

        // 让一个构造函数(类)一生只能有一个实例 



        // 思路:

        // 1. 实例化一个类的时候  
        // 2.判断当前类有没有实例化对象  ,如果没有,那就实例化对象
        // 3.如果已经实例化了  那么不再实例化  返回上一次实例化的对象 

        // 这样就保证了 这个类(构造函数) 只有一个实例 


        // 解决方案 

        // 单独找个变量 初始化为null  (null是一个特殊的对象)
        // 每一次创建实例 都要判断这个变量的值 
        // 如果是null 说明 以前没实例化   实例化对象 把这个对象赋值给这个变量 
        // 如果不是null 说明以前已经实例化了对象  直接返回这个变量 的值
        
        class Person{
            constructor(name){
                this.name = name;

            }
        }
        

        let instance = null; // 设置一个变量 初始化为null 
      
        function singleton(text){
            if(instance === null){
                instance = new Person(text)
            }
            return instance;
        }
    
    

        const t1 = singleton('张三');
        console.log(t1.name); // 张三

        const t2 = singleton('李四');

        console.log(t2.name);//张三

        const t3 = singleton('王五');

        console.log(t2.name);//张三


        console.log(t1 === t2); // true


         

        // 问题1: 多次传递数据 起不到改变的效果   上面三个都是返回张三
        // 问题2: 函数外边暴漏了一个变量  其它地方也可以改变这个值 
        // 问题3: 完全可以绕开函数实例化对象 让单例模式失效  
    
    </script>
</body>
</html>